/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
 
#define LL unsigned long long int

class Solution {
public:
    void xxx(int carryBit, ListNode *src, ListNode *dest)
    {
        while (carryBit && src->next!=NULL)
        {
            int n = src->val + carryBit;
            dest->next = new ListNode(n % 10);
            dest = dest->next;
            src = src->next;
            
            carryBit = n > 9 ? 1 : 0;
        }
        
        if (carryBit == 0)
        {
            dest->next = src;
        }
        else
        {
            int n = src->val + carryBit;
            dest->next = new ListNode(n % 10);
            if (n > 9)
            {
                dest->next->next = new ListNode(n / 10);
            }
        }
    }

	ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) 
	{
	    ListNode *res = new ListNode(0);
	    ListNode *listnode = res;
	    int carryBit = 0;
		while (true)
		{
		    if (l1->next == NULL && l2->next == NULL)
		    {
		        int n = l1->val + l2->val + carryBit;
		        listnode->next = new ListNode(n % 10);
		        if (n > 9)
		        {
		            listnode->next->next = new ListNode(n / 10);
		        }
		        break;
		    }
		    else if (l1->next == NULL)
		    {
		        int n = l1->val + l2->val + carryBit;
		        listnode->next = new ListNode(n % 10);
		        carryBit = n > 9 ? 1 : 0;
		        xxx(carryBit, l2->next, listnode->next);
		        break;
		    }
		    else if (l2->next == NULL)
		    {
		        int n = l1->val + l2->val + carryBit;
		        listnode->next = new ListNode(n % 10);
		        carryBit = n > 9 ? 1 : 0;
		        xxx(carryBit, l1->next, listnode->next);
		        break;
		    }
		    else
		    {
		        int n = l1->val + l2->val + carryBit;
		        carryBit = n > 9 ? 1 : 0;
		        listnode->next = new ListNode(n % 10);
		        listnode = listnode->next;
		    }
		    l1 = l1->next;
		    l2 = l2->next;
		}
		
		return res->next;
	}
};